package com.hf.bean;

import java.io.IOException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import tool.ClientTool;
import tool.TimeTool;

import com.base.bean.ClientBase;
import com.base.bean.ClientExtend;
import com.base.bean.ClientPhone;
import com.base.dao.ClientBaseDao;
import com.base.dao.ClientExtendDao;
import com.base.dao.ClientPhoneDao;
import com.base.dao._BaseDao;
import com.base.service.ClientService;

/**
 * 客户信息过滤器类主要功能：
 * 
 * 辅助类，用于验证客户基本信息(姓名/电话/是否属于自己) checkedResult: NAME#PHONE {name:N格式 C包含称呼
 * Y通过E未知错误 || phone：N格式 Y通过 R重复 E未知错误 逗号分隔} 2）重置cExtend中的sellPlan
 * 
 * 过滤器的主方法功能： 
 * 1）主要负责研制名字 电话格式 重复性验证 
 * 2）将sellplan根据参数进行重置
 * 3）
 * @author Administrator
 * 
 */
public class ClientFilter {

	private ClientBase cBase;
	private ClientExtend cExtend;
	private List<ClientPhone> pList;

	private String checkedResult; // ="NAME#PHONES";
	private boolean checked;

	private ClientService cs;

	public ClientFilter() {
		cs = ClientService.getInstance();
	}

	/**
	 * cBase cExtend pList 最好都是先从数据库中根据cid查询出来 然后再根据request参数做覆盖 这样以保证不丢失信息
	 * @param cBase
	 * @param cExtend
	 * @param pList
	 */
	public ClientFilter(ClientBase cBase, ClientExtend cExtend,
			List<ClientPhone> pList) {
		this.checkedResult = "N#N"; // 默认为电话姓名都不通过
		cs = ClientService.getInstance();
		this.cBase = cBase;
		this.cExtend = cExtend;
		this.pList = pList;
	}

	/**
	 * 过滤器的主方法功能： 
	 * 1）主要负责研制名字 电话格式 重复性验证 
	 * 2）将sellplan根据参数进行重置
	 * 3）
	 * @param clientFilter
	 * @return
	 */
	public ClientFilter filtering(ClientFilter clientFilter){
		String nChecked="";
		String pChecked="";
		try {
			switch(ClientTool.isName(this.cBase.getName())){
			case 0:
				nChecked="Y";
				break;
			case 1:
				nChecked="N";			//存在非法字符
				break;
			case 2:
				nChecked="C";			//包含称呼
				break;
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//	电话的验证
		for(int i=0;i<pList.size();i++){
			if(i>0 && i<pList.size())			//+逗号分隔
				pChecked=pChecked+",";
			if(!ClientTool.isMobileNO(pList.get(i).getPhone()))
				pChecked="N";				//格式错误
			
			if(cs.getClientPhoneDao().findByHql("from ClientPhone p where p.phone='"+pList.get(i).getPhone()+"'").size()>0)
				pChecked="R";				//重复
			
			else
				pChecked="Y";				
			
		}
		clientFilter.setCheckedResult(nChecked+"#"+pChecked);		//验证结果
		
		// GjTimeType!=0 则对sellplan进行重置
		int months=0;
		if(clientFilter.getcExtend().getGjTimeType()!=null)
			months=clientFilter.getcExtend().getGjTimeType();
		if(months!=0)
			clientFilter.cExtend.setSellPlan(TimeTool.nMonthLeater(months));
		
		// 判定结果
		Pattern p = Pattern.compile("Y#[Y,]+?");	//只有形如："Y#Y,Y,Y"的形式才表示正确
		Matcher m = p.matcher(this.checkedResult);
		clientFilter.setChecked(m.matches());	
        
		
		
		return clientFilter;
	}

	public static void main(String[] args) {
		// ClientFilter cc=new ClientFilter();
		// cc.setCid(70);
		// cc.setName("李老师");
		// cc.setUid(1);
		// cc.setPhones("15982079516|15982079516|159820795".split("\\|"));
		// ClientFilter cc2=cc.check(cc, 1);
		// System.out.println(cc2.getCheckResult());
		// System.out.println(cc2.isOwn);
	}

	public ClientBase getcBase() {
		return cBase;
	}

	public void setcBase(ClientBase cBase) {
		this.cBase = cBase;
	}

	public ClientExtend getcExtend() {
		return cExtend;
	}

	public void setcExtend(ClientExtend cExtend) {
		this.cExtend = cExtend;
	}

	public List<ClientPhone> getpList() {
		return pList;
	}

	public void setpList(List<ClientPhone> pList) {
		this.pList = pList;
	}

	/**
	 * NAME#PHONE {name:N格式 C包含称呼 Y通过E未知错误 || phone：N格式 Y通过 R重复 E未知错误 逗号分隔}
	 * 
	 * @return
	 */
	public String getCheckedResult() {
		return checkedResult;
	}

	public void setCheckedResult(String checkedResult) {
		this.checkedResult = checkedResult;
	}

	/**
	 * true：验证通过
	 * @return
	 */
	public boolean isChecked() {
		return checked;
	}

	public void setChecked(boolean checked) {
		this.checked = checked;
	}

}
